package com.z.xhelper.core.eventbus;

import com.z.xhelper.core.utils.LogUtil;

import java.util.ArrayList;
import java.util.HashMap;

public class ContextFactory<T> {
    private final HashMap<String, ArrayList<T>> map = new HashMap<>();

    // 只注册事件类型
    public void register(Class<?> event) {
        register(event.getName());
    }

    public void register(String event) {
        getContextMap(event);
    }

    public boolean hasRegister(Class<?> event, T listener) {
        return hasRegister(event.getName(),listener);
    }

    public boolean hasRegister(String event, T listener) {
        return getContextMap(event).contains(listener);
    }

    public void register(Class<?> event, T listener) {
        // 注册监听器
        // 保存监听器到对应的事件类型中
        register(event.getName(), listener);
    }

    public void register(String event, T listener) {
        if (hasRegister(event, listener)) {
            LogUtil.log("重复注册监听器");
            return;
        }
        // 保存监听器到对应的事件类型中
        getContextMap(event).add(listener);
    }


    public void unregister(String event, T listener) {
        // 从对应的事件类型中删除监听器
        ArrayList<T> listenerList = getContextMap(event);
        if (listenerList != null) {
            listenerList.remove(listener);
        }
    }

    // 注销监听器
    public void unregister(Class<?> event, T listener) {
        unregister(event.getName(), listener);
    }

    public ArrayList<T> getContextMap(Class<?> event) {
        return getContextMap(event.getName());
    }

    public ArrayList<T> getContextMap(String event) {
        if (!map.containsKey(event)) {
            map.put(event, new ArrayList<>());
        }
        return map.get(event);
    }
}
